#pragma once
#include <stdio.h>
#include <stdlib.h>

//实现不带头结点不带环的单链表的相关操作
typedef char LinkListType;

typedef struct LinkNode
{
    LinkListType data;
    struct LinkNode *next;

}LinkNode;
//创建一个节点
LinkNode *LinkNodeCreate(LinkListType value);
//销毁一个节点
void LinkNodeDestroy(LinkNode *to_delete);
//打印链表中的元素
void PrintListChar(LinkNode *head,const char *msg);
//链表的初始化
void LinkListInit(LinkNode **head);
//链表的头插
LinkNode *LinkListPushFront(LinkNode **head,LinkListType value);
//链表的头删
void LinkListPopFront(LinkNode **head);
//链表的尾插
void LinkListPushBack(LinkNode **head,LinkListType value);
//链表的尾删
void LinkListPopBack(LinkNode **head);
//查找元素在链表中的位置
LinkNode *LinkListFind(LinkNode *head,LinkListType to_find);
//在所给位置之前进行插入
void LinkListInsert(LinkNode **head,LinkNode *pos,LinkListType value);
//在所给位置之后进行插入
void LinkListInsertBack(LinkNode **head,LinkNode *pos,LinkListType value);
//删除指定位置的元素
void LinkListErase(LinkNode **head,LinkNode *pos);
//删除指定位置的元素(时间复杂度尾O(1))
void LinkListErase_1(LinkNode **head,LinkNode *pos);
//删除指定元素的节点
void LinkListRemove(LinkNode **head,LinkListType value);
//删除指定元素的节点（将所有该元素的节点都删除）
void LinkListRemoveAll(LinkNode **head,LinkListType value);
//链表的判空
int LinkListEmpty(LinkNode *head);
//求链表的大小
size_t LinkListSize(LinkNode *head);
//销毁链表
void LinkListDestroy(LinkNode **head);
